package com.cloud.filter;

import com.cloud.JwtParse;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;

/***
 * 请求前拦截
 */
//Spring扫描
@Component
public class LoginFilter extends ZuulFilter {

    @Autowired
    private JwtParse jwtUtil;

//    private Logger log = LoggerFactory.getLogger(getClass());


    /**
     * pre：路由之前
     * routing：路由之时
     * post： 路由之后
     * error：发送错误调用
     */
    @Override
    public String filterType() {
        return PRE_TYPE;
    }

    //值越小，越先执行
    @Override
    public int filterOrder() {
        return 0;
    }

    //true 拦截
    @Override
    public boolean shouldFilter() {
        RequestContext requestContext=RequestContext.getCurrentContext();
        HttpServletRequest request=requestContext.getRequest();
        String uri=request.getRequestURI();
        String url=request.getRequestURL().toString();
        //ACL 大公司使用，项目较小可以在下面控制
        if ("/renren-fast/sys/login".equalsIgnoreCase(uri)) {
            //web登录放行
            return false;
        }

        if ("/renren-fast/captcha.jpg".equalsIgnoreCase(uri)) {
            return false;
        }

        return true;
    }

    //shouldFilter返回true后处理业务逻辑，比如登录校验，一般采用JWT，以token方式校验（请求头或者参数）
    @Override
    public Object run() {
        System.out.println("拦截啦");
        RequestContext requestContext=RequestContext.getCurrentContext();
        HttpServletRequest request=requestContext.getRequest();
        //获取头部的token参数
        String token=request.getHeader("token");
        //TODO 放开token，测试用
        requestContext.addZuulRequestHeader("userId", "1");
        requestContext.setSendZuulResponse(true);

        //登陆校验逻辑 根据公司情况自定义 JWT
//        if (StringUtils.isBlank(token)){
//            //请求不向下传递
//            requestContext.setSendZuulResponse(false);
//            requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
//        } else {
//            //这里可以进一步校验token的合法性、时效性，甚至对报文进行校验
//            Claims claims;
//        try {
//            //解析没有异常则表示token验证通过，如有必要可根据自身需求增加验证逻辑
//            claims = jwtUtil.getClaimByToken(token);
//            log.info("token : {} 验证通过", token);
//            //请求头加入userId，传给业务服务
//            requestContext.addZuulRequestHeader("userId", claims.get("sub").toString());
//            requestContext.setSendZuulResponse(true);
//        } catch (ExpiredJwtException expiredJwtEx) {
//            log.error("token : {} 过期", token );
//            //不对请求进行路由
//            requestContext.setSendZuulResponse(false);
//            requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
//        } catch (Exception ex) {
//            log.error("token : {} 验证失败" , token );
//            requestContext.setSendZuulResponse(false);
//            requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
//            requestContext.setResponseBody("{\"result\":\"username is not correct!\"}");// 返回错误内容
//        }


//        }
        return null;
    }


//    /**
//     * 执行过滤器逻辑，验证token
//     *
//     * @return
//     */
//    @Override
//    public Object run() {
//        RequestContext ctx = RequestContext.getCurrentContext();
//        HttpServletRequest request = ctx.getRequest();
//        String token = request.getHeader("token");
//        Claims claims;
//        try {
//            //解析没有异常则表示token验证通过，如有必要可根据自身需求增加验证逻辑
//            claims = jwtUtil.parseJWT(token);
//            log.info("token : {} 验证通过", token);
//            //对请求进行路由
//            ctx.setSendZuulResponse(true);
//            //请求头加入userId，传给业务服务
//            ctx.addZuulRequestHeader("userId", claims.get("userId").toString());
//        } catch (ExpiredJwtException expiredJwtEx) {
//            log.error("token : {} 过期", token );
//            //不对请求进行路由
//            ctx.setSendZuulResponse(false);
//            responseError(ctx, -402, "token expired");
//        } catch (Exception ex) {
//            log.error("token : {} 验证失败" , token );
//            //不对请求进行路由
//            ctx.setSendZuulResponse(false);
//            responseError(ctx, -401, "invalid token");
//        }
//        return null;
//    }
//
//    /**
//     * 将异常信息响应给前端
//     */
//    private void responseError(RequestContext ctx, int code, String message) {
//        HttpServletResponse response = ctx.getResponse();
//        Result errResult = new Result();
//        errResult.setCode(code);
//        errResult.setMessage(message);
//        ctx.setResponseBody(toJsonString(errResult));
//        response.setCharacterEncoding(StandardCharsets.UTF_8.name());
//        response.setContentType("application/json;charset=utf-8");
//    }
//
//    private String toJsonString(Object o) {
//        try {
//            return objectMapper.writeValueAsString(o);
//        } catch (JsonProcessingException e) {
//            log.error("json序列化失败", e);
//            return null;
//        }
//    }
}
